const OSS = require('ali-oss');

const client = new OSS({
  // yourRegion填写Bucket所在地域。以华东1（杭州）为例，Region填写为oss-cn-hangzhou。
  region: 'oss-cn-beijing',
  // 从STS服务获取的临时访问密钥（AccessKey ID和AccessKey Secret）。
  accessKeyId: 'LTAI5tBze5tT8ZCN1hLNJxVx',
  accessKeySecret: 'a25cgwTbaSHTVI0upKgnEJsaJqivPO',
  // 从STS服务获取的安全令牌（SecurityToken）。
  // stsToken: 'yourSecurityToken',
  // refreshSTSToken: async () => {
  //   // 向您搭建的STS服务获取临时访问凭证。
  //   const info = await fetch('your_sts_server');
  //   return {
  //     accessKeyId: info.accessKeyId,
  //     accessKeySecret: info.accessKeySecret,
  //     stsToken: info.stsToken
  //   }
  // },
  // // 刷新临时访问凭证的时间间隔，单位为毫秒。
  // refreshSTSTokenInterval: 300000,
  // 填写Bucket名称。
  bucket: 'porpoise'
});

/**
 * 同步上传方法。
 * @returns {Promise<void>}
 */
async function putSync(fileName, file) {
  try {
    // fileName表示上传到OSS的文件名称。
    // file表示浏览器中需要上传的文件，支持HTML5 file和Blob类型。
    const r1 = await client.put(fileName, file);
    console.log('put success: %j', r1);
    const r2 = await client.get(fileName);
    console.log('get success: %j', r2);
  } catch (e) {
    console.error('error: %j', e);
  }
}

/**
 * 异步上传方法。
 * @param fileName
 * @param file
 */
function put(fileName, file) {
  return new Promise((resolve, reject) => {
    client.put(fileName, file).then(res => {
      resolve(res)
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * 自定义批量上传。
 * @param imageListArr
 */
function batchPut(imageListArr) {
  if (!imageListArr || imageListArr.length === 0) {
    return;
  }

  return new Promise((resolve, reject) => {
    let totalLength = imageListArr.length;
    let currIndex, succeeNum, failedNum = 0;
    imageListArr.forEach(item => {
      let fileName = item.name;
      currIndex++;
      client.put(`slidePictures/${fileName}`, item.raw).then(res => {
        // this.$message.success('上传成功!');
        console.log(`文件${fileName}上传成功！`)
        succeeNum++;
        if (currIndex === totalLength) { //完成全部上传
          if (succeeNum === totalLength) { //全部上传成功
            resolve(succeeNum);
          } else { //部分上传成功
            reject(`上传失败，总个数${totalLength}，其中上传成功${succeeNum}个，上传失败${failedNum}个 !`)
          }
        }
      }).catch(err => {
        console.log(`文件${fileName}上传失败！err: `, err)
        failedNum++;
        if (currIndex === totalLength) { //完成全部上传
          reject(`上传失败，总个数${totalLength}，其中上传成功${succeeNum}个，上传失败${failedNum}个 !`)
        }
      });
    })
  })
}

/**
 * 异步获取指定目录下的所有文件。
 * @param dir
 */
function listDir(dir) {
  return new Promise((resolve, reject) => {
    client.list({
      prefix: dir,
      // 设置正斜线（/）为文件夹的分隔符。
      delimiter: '/'
    }).then(res => {
      // console.log("listDir res= ", res)
      resolve(res)
    }).catch(err => {
      console.log("listDir err= ", err)
      reject(err)
    })
  })
}

// 上传成功之后，转换文件的签名url
// 注意：文件名fileName需为完整路径，其路径中不能包含Bucket名称。示例："slidePictures/1690513837643_6cf872cf.png"
function signatureUrl(fileName) {
  // 设置URL的有效时长。单位为秒。如果不设置有效时长，则默认为1800。以3600秒，expires填写为3600。
//let url = client.signatureUrl(fileName, {expires: 3600});
  let url = client.signatureUrl(fileName)
  ////结果示例："http://porpoise.oss-cn-beijing.aliyuncs.com/slidePictures/1690513837643_6cf872cf.png?
  //  OSSAccessKeyId=LTAI5tBze5tT8ZCN1hLNJxVx&Expires=1690524956&Signature=dBvCAtyHyPf6xQKfuffAS4uf%2FUM%3D"
  // console.log("signatureUrl url: ", url)
  return url
}

/**
 * 删除多个文件
 * @param fileNameArr 文件名数组，示例：["slidePictures/1690513837643_6cf872cf.png"]
 * @returns {Promise<unknown>}
 */
function deleteMulti(fileNameArr) {
  console.log("deleteMulti fileNameArr: ", fileNameArr)
  return new Promise((resolve, reject) => {
    client.deleteMulti(fileNameArr, {
      // 通过quiet参数指定是否返回所有删除的文件列表。当quiet指定为true时，OSS不返回消息体。当quiet指定为false时，OSS返回所有删除的文件列表。
      quiet: false
    }).then(res => {
      resolve(res)
    }).catch(err => {
      reject(err)
    })
  })
}

/**
 * 删除单个文件。
 * @param fileName
 * @returns {Promise<unknown>}
 */
function deleteOne(fileName) {
  console.log("deleteOne fileName: ", fileName);
  return new Promise((resolve, reject) => {
    client.delete(fileName).then(res => {
      resolve(res)
    }).catch(err => {
      reject(err)
    })
  })
}

export default {
  put,
  putSync,
  batchPut,
  listDir,
  signatureUrl,
  deleteOne,
  deleteMulti
}



